﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using VNPT.Excel;
using System.IO;
using VNPT.Data;
using DevExpress.XtraGrid;

namespace VNPT.DoiSoat.DoiSoat
{
    public partial class u110_KetNoi_64TinhThanh : VNPT.Core.uBase
    {
        public u110_KetNoi_64TinhThanh()
        {
            InitializeComponent();

            StyleFormatCondition condition1 = new DevExpress.XtraGrid.StyleFormatCondition();
            condition1.Appearance.BackColor = Color.Red;
            condition1.Appearance.Options.UseBackColor = true;
            condition1.Condition = FormatConditionEnum.NotBetween;
            condition1.Value1 = "-1";
            condition1.Value2 = "1";
            condition1.Column = colTiLe_Den;
            myGridView1.FormatConditions.Add(condition1);


            StyleFormatCondition condition2 = new DevExpress.XtraGrid.StyleFormatCondition();
            condition2.Appearance.BackColor = Color.Red;
            condition2.Appearance.Options.UseBackColor = true;
            condition2.Condition = FormatConditionEnum.NotBetween;
            condition2.Value1 = "-1";
            condition2.Value2 = "1";
            condition2.Column = colTiLe_Den_GPH;
            myGridView1.FormatConditions.Add(condition2);

            StyleFormatCondition condition3 = new DevExpress.XtraGrid.StyleFormatCondition();
            condition3.Appearance.BackColor = Color.Red;
            condition3.Appearance.Options.UseBackColor = true;
            condition3.Condition = FormatConditionEnum.NotBetween;
            condition3.Value1 = "-1";
            condition3.Value2 = "1";
            condition3.Column = colTiLe_Di;
            myGridView1.FormatConditions.Add(condition3);

            StyleFormatCondition condition4 = new DevExpress.XtraGrid.StyleFormatCondition();
            condition4.Appearance.BackColor = Color.Red;
            condition4.Appearance.Options.UseBackColor = true;
            condition4.Condition = FormatConditionEnum.NotBetween;
            condition4.Value1 = "-1";
            condition4.Value2 = "1";
            condition4.Column = colTiLe_Di_GPH;
            myGridView1.FormatConditions.Add(condition4);

        }
        List<DS64TinhThanh> li = new List<DS64TinhThanh>();
        public override void SaveSetting()
        {
            base.SaveSetting();

        }

        public override void LoadSetting()
        {
            LoadTemplateData();
            base.LoadSetting();
        }

        private List<string> GetSheetName(string Path)
        {
            List<string> kq = new List<string>();
            if (System.IO.File.Exists(Path))
            {
                FileStream stream = File.Open(Path, FileMode.Open);//, FileMode.Open, FileAccess.Read);
                IExcelDataReader excelReader;
                if (Path.EndsWith(".xls"))
                {
                    excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
                }
                else
                {
                    if (Path.EndsWith(".xlsx"))
                    {
                        excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
                    }
                    else
                    {
                        DevExpress.XtraEditors.XtraMessageBox.Show("File không hợp lệ!");
                        return null;
                    }
                }

                excelReader.IsFirstRowAsColumnNames = true;
                DataSet result = excelReader.AsDataSet();

                foreach (var item in result.Tables)
                {
                    kq.Add(((DataTable)item).TableName);
                }
                return kq;
            }
            return null;
        }

        private void LoadTemplateData()
        {
            li.Clear();
            var path = Application.StartupPath + "\\DoiSoat\\Ma64Tinh.xls";
            var dt = GetData(path, 0);
            foreach (var item in dt.Rows)
            {
                var dr = (DataRow)item;
                li.Add(new DS64TinhThanh()
                {
                    MaMang = dr["MA_MANG"].ToString(),
                    TenTinh = dr["TEN"].ToString()
                });
            }
            myGridControl1.DataSource = li;
        }

        private DataTable GetData(string Path, string TableName)
        {
            if (System.IO.File.Exists(Path))
            {
                FileStream stream = File.Open(Path, FileMode.Open);//, FileMode.Open, FileAccess.Read);
                IExcelDataReader excelReader;
                if (Path.EndsWith(".xls"))
                {
                    excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
                }
                else
                {
                    if (Path.EndsWith(".xlsx"))
                    {
                        excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
                    }
                    else
                    {
                        DevExpress.XtraEditors.XtraMessageBox.Show("File không hợp lệ!");
                        return null;
                    }
                }

                excelReader.IsFirstRowAsColumnNames = true;
                DataSet result = excelReader.AsDataSet();

                return result.Tables[TableName];
            }
            return null;
        }

        private DataTable GetData(string Path, int index)
        {
            if (System.IO.File.Exists(Path))
            {
                FileStream stream = File.Open(Path, FileMode.Open);//, FileMode.Open, FileAccess.Read);
                IExcelDataReader excelReader;
                if (Path.EndsWith(".xls"))
                {
                    excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
                }
                else
                {
                    if (Path.EndsWith(".xlsx"))
                    {
                        excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
                    }
                    else
                    {
                        DevExpress.XtraEditors.XtraMessageBox.Show("File không hợp lệ!");
                        return null;
                    }
                }

                excelReader.IsFirstRowAsColumnNames = true;
                DataSet result = excelReader.AsDataSet();

                return result.Tables[index];
            }
            return null;
        }

        private void btnCapNhat_Click(object sender, EventArgs e)
        {
            new VNPT.Utility.Grid.GridExport().Export(myGridControl1);

        }

        public void SetBindingSourceDataSource(object newDataSource)
        {
            if (InvokeRequired)
                Invoke(new Action<object>(SetBindingSourceDataSource), newDataSource);
            else
                this.myGridControl1.DataSource = newDataSource;
        }

        private void btnPath_EditValueChanged(object sender, EventArgs e)
        {
            lkSheetName.Properties.DataSource = GetSheetName(myButtonPath1.Text);
        }


        //Ok
        private void btnImport_Click(object sender, EventArgs e)
        {
            //Load dữ liệu từ file thô của VTT
            var dt = GetData(myButtonPath1.Text, lkSheetName.EditValue.ToString());
            foreach (var item in dt.Rows)
            {
                var dr = (DataRow)item;
                var Ten = (dr["TENTINH"] ?? "").ToString();
                var loai = (dr["LOAI"] ?? "").ToString();

                #region Cố định DLK gọi đi và đến
                var tem2 = li.Where(p => p.TenTinh == Ten && !p.MaMang.EndsWith("GPH"));
                //Cố định gọi vào cố định các tỉnh
                if (tem2.Any() && loai.ToUpper() == "CD")
                {
                    int t = 0;
                    int.TryParse((dr["CD_DI"] ?? "0").ToString(), out t);
                    tem2.First().Di = t;

                    int.TryParse((dr["CD_DEN"] ?? "0").ToString(), out t);
                    tem2.First().Den = t;
                }
                // Cố định gọi vào Gphone các tỉnh
                var tem3 = li.Where(p => p.TenTinh == Ten && p.MaMang.EndsWith("GPH"));
                if (tem3.Any() && loai.ToUpper() == "CD")
                {
                    int t = 0;
                    int.TryParse((dr["GP_DI"] ?? "0").ToString(), out t);
                    tem3.First().Di = t;

                    int.TryParse((dr["GP_DEN"] ?? "0").ToString(), out t);
                    tem3.First().Den = t;
                }
                #endregion

                #region GPhone DLK gọi đi và đến
                var tem5 = li.Where(p => p.TenTinh == Ten && !p.MaMang.EndsWith("GPH"));
                //Cố định gọi vào cố định các tỉnh
                if (tem5.Any() && loai.ToUpper() == "GP")
                {
                    int t = 0;
                    int.TryParse((dr["CD_DI"] ?? "0").ToString(), out t);
                    tem5.First().Di_GPH = t;

                    int.TryParse((dr["CD_DEN"] ?? "0").ToString(), out t);
                    tem5.First().Den_GPH = t;
                }
                // Cố định gọi vào Gphone các tỉnh
                var tem4 = li.Where(p => p.TenTinh == Ten && p.MaMang.EndsWith("GPH"));
                if (tem4.Any() && loai.ToUpper() == "GP")
                {
                    int t = 0;
                    int.TryParse((dr["GP_DI"] ?? "0").ToString(), out t);
                    tem4.First().Di_GPH = t;

                    int.TryParse((dr["GP_DEN"] ?? "0").ToString(), out t);
                    tem4.First().Den_GPH = t;
                }
                #endregion


            }
            myGridControl1.DataSource = li;
            myGridControl1.RefreshDataSource();
        }


        private List<DS64TinhThanh> Get_SQL_GOI_DEN_CO_DINH_DLK(DbNetData db)
        { // PHUT, MA_MANG, CUOC
            string sqlString = string.Format(DoiSoatSetting.SQL_GOI_DEN_CO_DINH_DLK, DoiSoatSetting.NAM, DoiSoatSetting.THANG);
            var dt = db.GetDataTable(new QueryCommandConfig(sqlString));
            List<DS64TinhThanh> li_temp = new List<DS64TinhThanh>();

            foreach (var item in dt.Rows)
            {
                var dr = (DataRow)item;
                var Ma_Mang = (dr["Ma_Mang"] ?? "").ToString();

                int t = 0;
                int.TryParse((dr["PHUT"] ?? "0").ToString(), out t);

                li_temp.Add(new DS64TinhThanh()
                {
                    MaMang = Ma_Mang,
                    Phut = t
                });
            }
            var tem = (from p in li_temp
                       group p by p.MaMang_Group into g
                       select new DS64TinhThanh()
                       {
                           MaMang = g.First().MaMang_Group,
                           Phut = g.Sum(p => p.Phut)
                       }).ToList();
            return tem;
        }

        private List<DS64TinhThanh> Get_SQL_GOI_DEN_GPHONE_DLK(DbNetData db)
        { // PHUT, MA_MANG, CUOC
            string sqlString = string.Format(DoiSoatSetting.SQL_GOI_DEN_GPHONE_DLK, DoiSoatSetting.NAM, DoiSoatSetting.THANG);
            var dt = db.GetDataTable(new QueryCommandConfig(sqlString));
            List<DS64TinhThanh> li_temp = new List<DS64TinhThanh>();

            foreach (var item in dt.Rows)
            {
                var dr = (DataRow)item;
                var Ma_Mang = (dr["Ma_Mang"] ?? "").ToString();

                int t = 0;
                int.TryParse((dr["PHUT"] ?? "0").ToString(), out t);

                li_temp.Add(new DS64TinhThanh()
                {
                    MaMang = Ma_Mang,
                    Phut = t
                });
            }
            var tem = (from p in li_temp
                       group p by p.MaMang_Group into g
                       select new DS64TinhThanh()
                       {
                           MaMang = g.First().MaMang_Group,
                           Phut = g.Sum(p => p.Phut)
                       }).ToList();
            return tem;
        }

        private List<DS64TinhThanh> Get_SQL_GPHONE_DLK_GOI_DI(DbNetData db)
        { // PHUT, MA_MANG, CUOC
            string sqlString = string.Format(DoiSoatSetting.SQL_GPHONE_DLK_GOI_DI, DoiSoatSetting.NAM, DoiSoatSetting.THANG);
            var dt = db.GetDataTable(new QueryCommandConfig(sqlString));
            List<DS64TinhThanh> li_temp = new List<DS64TinhThanh>();

            foreach (var item in dt.Rows)
            {
                var dr = (DataRow)item;
                var Ma_Mang = (dr["Ma_Mang"] ?? "").ToString();

                int t = 0;
                int.TryParse((dr["PHUT"] ?? "0").ToString(), out t);

                li_temp.Add(new DS64TinhThanh()
                {
                    MaMang = Ma_Mang, Phut =t
                });
            }
            var tem = (from p in li_temp
                       group p by p.MaMang_Group into g
                       select new DS64TinhThanh()
                       {
                           MaMang =g.First().MaMang_Group,
                           Phut =g.Sum(p=>p.Phut)
                       }).ToList();
            return tem;
        }

        private List<DS64TinhThanh> Get_SQL_CO_DINH_DLK_GOI_DI(DbNetData db)
        { // PHUT, MA_MANG, CUOC
            string sqlString = string.Format(DoiSoatSetting.SQL_CO_DINH_DLK_GOI_DI, DoiSoatSetting.NAM, DoiSoatSetting.THANG);
             var dt= db.GetDataTable(new QueryCommandConfig(sqlString));

             List<DS64TinhThanh> li_temp = new List<DS64TinhThanh>();

             foreach (var item in dt.Rows)
             {
                 var dr = (DataRow)item;
                 var Ma_Mang = (dr["Ma_Mang"] ?? "").ToString();

                 int t = 0;
                 int.TryParse((dr["PHUT"] ?? "0").ToString(), out t);

                 li_temp.Add(new DS64TinhThanh()
                 {
                     MaMang = Ma_Mang,
                     Phut = t
                 });
             }
             var tem = (from p in li_temp
                        group p by p.MaMang_Group into g
                        select new DS64TinhThanh()
                        {
                            MaMang = g.First().MaMang_Group,
                            Phut = g.Sum(p => p.Phut)
                        }).ToList();
             return tem;
        }


        private void TruocKhiChay()
        {
            myGridView1.OptionsView.WaitAnimationOptions = DevExpress.XtraEditors.WaitAnimationOptions.Panel;
            this.panelControl1.Enabled = false;
            myGridView1.ShowLoadingPanel();
            DevExpress.XtraEditors.XtraForm f = null;
            if ((this.Parent as DevExpress.XtraEditors.XtraForm) != null)
            {
                f = this.Parent as DevExpress.XtraEditors.XtraForm;
            }
            else
            {
                if ((this.Parent.Parent as DevExpress.XtraEditors.XtraForm) != null)
                {
                    f = this.Parent.Parent as DevExpress.XtraEditors.XtraForm;
                }
                else
                {
                    if ((this.Parent.Parent.Parent as DevExpress.XtraEditors.XtraForm) != null)
                    {
                        f = this.Parent.Parent.Parent as DevExpress.XtraEditors.XtraForm;
                    }
                }
            }

            if (f != null)
            {
                f.FormClosing += (a1, e1) =>
                {
                    if (bgWork.IsBusy)
                    {
                        string text = "Chương trình đang chạy, không thể đóng form! Vui lòng hủy trước khi đóng chương trình?";
                        string caption = "Xác nhận?";
                        DevExpress.XtraEditors.XtraMessageBox.Show(text, caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        e1.Cancel = true;
                    }
                };
            }
        }
        private void SaukhiChay()
        {
            this.panelControl1.Enabled = true;
            myGridView1.HideLoadingPanel();

            var CD_Di = (float)li.Sum(p => p.Di);
            var CD_Di_DLK = (float)li.Sum(p => p.Di_DLK);

            var tlCD_Di = CD_Di > CD_Di_DLK ? (CD_Di - CD_Di_DLK) * 100 / CD_Di : (CD_Di_DLK - CD_Di) * 100 / CD_Di_DLK;
            lblCoDinhDi.Text = string.Format("TL Cố định đi {0:n2}%", tlCD_Di);

            var CD_Den = (float)li.Sum(p => p.Den);
            var CD_Den_DLK = (float)li.Sum(p => p.Den_DLK);

            var tlCD_Den = CD_Den > CD_Den_DLK ? (CD_Den - CD_Den_DLK) * 100 / CD_Den : (CD_Den_DLK - CD_Den) * 100 / CD_Den_DLK;
            lblCoDinhDen.Text = string.Format("TL Cố định đến {0:n2}%", tlCD_Den);

            var GP_Di = (float)li.Sum(p => p.Di_GPH);
            var GP_Di_DLK = (float)li.Sum(p => p.Di_GPH_DLK);

            var tlGP_Di = GP_Di > GP_Di_DLK ? (GP_Di - GP_Di_DLK) * 100 / GP_Di : (GP_Di_DLK - GP_Di) * 100 / GP_Di_DLK;
            lblGPhoneDi.Text = string.Format("TL GPhone đi {0:n2}%", tlGP_Di);

            var GP_Den = (float)li.Sum(p => p.Den_GPH);
            var GP_Den_DLK = (float)li.Sum(p => p.Den_GPH_DLK);

            var tlGP_Den = GP_Den > GP_Den_DLK ? (GP_Den - GP_Den_DLK) * 100 / GP_Den : (GP_Den_DLK - GP_Den) * 100 / GP_Den_DLK;
            lblGPhoneDen.Text = string.Format("TL GPhone đến {0:n2}%", tlGP_Den);

        }
        private void mySimpleButton2_Click(object sender, EventArgs e)
        {
            TruocKhiChay();
            bgWork.RunWorkerAsync();
        }

        void ThucHien()
        {
            //Lấy cố định gọi đeend
            var dt = Get_SQL_GOI_DEN_CO_DINH_DLK(DbServer);

            foreach (var item in dt)
            {
                var Ma_Mang = item.MaMang;
                var tem = li.Where(p => p.MaMang == Ma_Mang);
                if (tem.Any())
                {
                    int t = item.Phut;
                    tem.First().Den_DLK = t;
                }
                UpdateGridControl();
            }

            //return;
            //Lấy cố định gọi đến
            var dt2 = Get_SQL_GOI_DEN_GPHONE_DLK(DbServer);
            foreach (var item in dt2)
            {
                var Ma_Mang = item.MaMang;
                var tem = li.Where(p => p.MaMang == Ma_Mang);
                if (tem.Any())
                {
                    tem.First().Den_GPH_DLK = item.Phut;
                }
                UpdateGridControl();
            }

            var dt3 = Get_SQL_GPHONE_DLK_GOI_DI(DbServer);
            foreach (var item in dt3)
            {
                var Ma_Mang = item.MaMang;
                var tem = li.Where(p => p.MaMang == Ma_Mang);
                if (tem.Any())
                {
                    int t = item.Phut;
                    tem.First().Di_GPH_DLK = t;
                }
                UpdateGridControl();
            }

            var dt4 = Get_SQL_CO_DINH_DLK_GOI_DI(DbServer);
            foreach (var item in dt4)
            {
                var Ma_Mang = item.MaMang;
                var tem = li.Where(p => p.MaMang == Ma_Mang);
                if (tem.Any())
                {
                    int t = item.Phut;
                    tem.First().Di_DLK = t;
                }
                UpdateGridControl();
            }
            SetBindingSourceDataSource(li);
            UpdateGridControl();
        }

        private void bgWork_DoWork(object sender, DoWorkEventArgs e)
        {
            ThucHien();
        }

        private void bgWork_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {

        }
        private void UpdateGridControl()
        {
            this.myGridControl1.BeginInvoke
            (
                new MethodInvoker
                (
                    delegate
                    {
                        myGridControl1.RefreshDataSource();
                        myGridControl1.Refresh();
                    }
                )
            );
        }
        private void bgWork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            SaukhiChay();

            if (e.Error != null)
            {
                DevExpress.XtraEditors.XtraMessageBox.Show("Hoàn thành, có phát sinh lỗi.\nVui lòng kiểm tra lại!\n" + e.Error.Message, "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                DevExpress.XtraEditors.XtraMessageBox.Show("Đã thành công!", "Thông báo!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }


        private void barDenCoDinhDLK_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new fEditSQL("SQL_GOI_DEN_CO_DINH_DLK",
                "GPhone, Cố định các tỉnh gọi đến Cố định DakLak",
                "Trả về PHUT,và MA_MANG. Các tham số {0}= Năm, {1:D2}= Tháng").ShowDialog();
        }

        private void barGoiDenGPhoneDLK_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new fEditSQL("SQL_GOI_DEN_GPHONE_DLK",
                "GPhone, Cố định các tỉnh gọi đến GPhone DakLak",
                "Trả về PHUT,và MA_MANG. Các tham số {0}= Năm, {1:D2}= Tháng").ShowDialog();
        }

        private void barGPhoneGoiDi_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new fEditSQL("SQL_GPHONE_DLK_GOI_DI",
                "Gphone DakLak gọi đi Gphone, Cố định các tỉnh thành",
                "Trả về PHUT,và MA_MANG. Các tham số {0}= Năm, {1:D2}= Tháng").ShowDialog();
        }

        private void barCoDinhGoiDi_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            new fEditSQL("SQL_CO_DINH_DLK_GOI_DI",
                "Cố định DakLak gọi đi Gphone, Cố định các tỉnh thành",
                "Trả về PHUT,và MA_MANG. Các tham số {0}= Năm, {1:D2}= Tháng").ShowDialog();
        }
    }
}
